package com.boilermaker.lotterysystem.common.converter;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter;
import org.springframework.stereotype.Component;

import java.lang.reflect.Type;

/**
 * Spring使用 HttpMessageConverter 来处理请求/响应的序列化和反序列化：
 * <p>
 * 若不添加该配置类：
 * <p>
 * Spring 默认的 Jackson 转换器只能精确处理 application/json 等 Content-Type，
 * 当通过 multipart/form-data 发送 JSON 时，Spring 可能无法正确识别，
 * 导致 @RequestPart("param") PrizeParam param 无法自动反序列化。
 * <p>
 * 添加这个配置类后：
 * <p>
 * Spring 现在能识别 APPLICATION_OCTET_STREAM 类型的数据并尝试用 Jackson 转换，
 * 将表单中的 JSON 部分自动转换为 PrizeParam 对象
 */
@Component
public class MultipartJackson2HttpMessageConverter
        extends AbstractJackson2HttpMessageConverter {

    protected MultipartJackson2HttpMessageConverter(ObjectMapper objectMapper) {
        // 声明这个转换器处理 APPLICATION_OCTET_STREAM 类型的数据
        super(objectMapper, MediaType.APPLICATION_OCTET_STREAM);
    }

    @Override
    public boolean canWrite(Class<?> clazz, MediaType mediaType) {
        // 转换器不用于写入（即不用于响应的序列化）
        return false;
    }

    @Override
    public boolean canWrite(Type type, Class<?> clazz, MediaType mediaType) {
        return false;
    }

    @Override
    protected boolean canWrite(MediaType mediaType) {
        return false;
    }
}